home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_11_06
/
1106084b
< prev
next >
Wrap
Text File
|
1993-04-06
|
9KB
|
298 lines
/**********************************************
*
* pixel_grow(...
*
* The function grows regions. It is similar
* to the grow function in segment.c, but it
* has several new capabilities. It can
* eliminate regions if they are too large or
* too small.
*
* It ignores pixels = FORGET_IT. This allows
* it to ignore edges or regions already
* eliminated from consideration.
*
* It adds pixels to a growing region only if
* the pixel is close enough to the average gray
* level of that region.
*
***********************************************/
pixel_grow(input, output, diff, min_area, max_area)
short input[ROWS][COLS],
output[ROWS][COLS],
max_area,
min_area,
diff;
{
char name[80];
int count,
first_call,
i,
ii,
j,
jj,
object_found,
pointer,
pop_i,
pop_j,
stack_empty,
stack_file_in_use;
short g_label, target, sum, stack[STACK_SIZE][2];
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
output[i][j] = 0;
g_label = 2;
object_found = 0;
first_call = 1;
/*************************************
*
* Now begin the process of growing
* regions.
*
**************************************/
for(i=0; i<ROWS; i++){
if( (i%4) == 0) printf("\n");
printf("-i=%3d label=%3d", i, g_label);
for(j=0; j<COLS; j++){
target = input[i][j];
sum = target;
count = 0;
stack_file_in_use = 0;
stack_empty = 1;
pointer = -1;
/**********************************
*
* Search for the first pixel of
* a region. It must not equal
* FORGET_IT, and it must be close
* enough to the target (ave value).
*
***********************************/
if(input[i][j] != FORGET_IT &&
is_close(input[i][j], target, diff) &&
output[i][j] == 0){
pixel_label_and_check_neighbor(input,
output, &target, &sum,
&count, stack, g_label,
&stack_empty, &pointer,
i, j, diff,
&stack_file_in_use,
&first_call);
object_found = 1;
} /* ends if is_close */
/*****************************
*
* If the stack is not empty,
* pop the coordinates of
* the pixel off the stack
* and check its 8 neighbors.
*
*******************************/
while(stack_empty == 0){
pop_i = stack[pointer][0]; /* POP */
pop_j = stack[pointer][1]; /* OPERATION */
--pointer;
if(pointer <= 0){
if(stack_file_in_use){
pop_data_off_of_stack_file(
stack,
&pointer,
&stack_file_in_use);
} /* ends if stack_file_in_use */
else{
pointer = 0;
stack_empty = 1;
} /* ends else stack file is
not in use */
} /* ends if point <= 0 */
pixel_label_and_check_neighbor(input,
output, &target, &sum,
&count, stack, g_label,
&stack_empty, &pointer,
pop_i, pop_j,
diff, &stack_file_in_use,
&first_call);
} /* ends while stack_empty == 0 */
if(object_found == 1){
object_found = 0;
/**********************************
*
* The object must be in the
* size constraints given by
* min_area and max_area
*
*********************************/
if(count >= min_area &&
count <= max_area)
++g_label;
/**********************************
*
* Remove the object from the
* output. Set all pixels in the
* object you are removing to
* FORGET_IT.
*
**********************************/
else{
for(ii=0; ii<ROWS; ii++){
for(jj=0; jj<COLS; jj++){
if(output[ii][jj] == g_label){
output[ii][jj] = 0;
input[ii][jj] = FORGET_IT;
} /* ends if output == g_label */
} /* ends loop over jj */
} /* ends loop over ii */
} /* ends else remove object */
} /* ends if object_found == 1 */
} /* ends loop over j */
} /* ends loop over i */
printf("\nGROW> found %d objects", g_label);
} /* ends pixel_grow */
/********************************************
*
* pixel_label_and_check_neighbors(...
*
* This function labels a pixel with an object
* label and then checks the pixel's 8
* neighbors. If any of the neigbors are
* set, then they are also labeled.
*
* It also updates the target or ave pixel
* value of the pixels in the region being
* grown.
*
***********************************************/
pixel_label_and_check_neighbor(input_image,
output_image, target,
sum, count, stack,
g_label, stack_empty,
pointer, r, e, diff,
stack_file_in_use,
first_call)
int *count,
e,
*first_call,
*pointer,
r,
*stack_empty,
*stack_file_in_use;
short input_image[ROWS][COLS],
output_image[ROWS][COLS],
g_label,
*sum,
*target,
stack[STACK_SIZE][2],
diff;
{
int already_labeled = 0,
i, j;
if (output_image[r][e] != 0)
already_labeled = 1;
output_image[r][e] = g_label;
*count = *count + 1;
if(*count > 1){
*sum = *sum + input_image[r][e];
*target = *sum / *count;
}
/***************************************
*
* Look at the 8 neighors of the
* point r,e.
*
* Ensure the points are close enough
* to the target and do not equal
* FORGET_IT.
*
* Ensure the points you are checking
* are in the image, i.e. not less
* than zero and not greater than
* ROWS-1 or COLS-1.
*
***************************************/
for(i=(r-1); i<=(r+1); i++){
for(j=(e-1); j<=(e+1); j++){
if((i>=0) &&
(i<=ROWS-1) &&
(j>=0) &&
(j<=COLS-1)){
if( input_image[i][j] != FORGET_IT &&
is_close(input_image[i][j],
*target, diff) &&
output_image[i][j] == 0){
*pointer = *pointer + 1;
stack[*pointer][0] = i; /* PUSH */
stack[*pointer][1] = j; /* OPERATION */
*stack_empty = 0;
if(*pointer >= (STACK_SIZE -
STACK_FILE_LENGTH)){
push_data_onto_stack_file(stack,
pointer, first_call);
*stack_file_in_use = 1;